//package com.wfbi.security.chapter27;
//
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.core.annotation.Order;
//import org.springframework.security.config.annotation.web.builders.HttpSecurity;
//import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
//import org.springframework.security.core.userdetails.User;
//import org.springframework.security.core.userdetails.UserDetailsService;
//import org.springframework.security.provisioning.InMemoryUserDetailsManager;
//
///**
// * 每一个过滤器链都会绑定一个自己的 ProviderManager（即 AuthenticationManager 的实现），
// * 而每一个 ProviderManager 中都通过 DaoAuthenticationProvider 持有一个 UserDetailsService 对象，
// * 你可以简单理解为一个 ProviderManager 管理了一个 UserDetailsService，
// * 当我们开始认证的时候，首先由过滤器链所持有的局部 ProviderManager 去认证，
// * 要是认证失败了，则调用 ProviderManager 的 parent 再去认证，
// * 此时就会用到全局 AuthenticationManager 所持有的 UserDetailsService 对象了。
// */
//@Configuration
//public class SecurityConfig2 {
//    /**
//     * 父类UserDetailsService
//     *
//     * @return
//     */
//    @Bean
//    UserDetailsService us() {
//        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//        manager.createUser(User.withUsername("sang").password("{noop}123").roles("admin").build());
//        return manager;
//    }
//
//    /**
//     * 过滤器链1，单独配置UserDetailsService
//     */
//    @Configuration
//    @Order(1)
//    static class DefaultWebSecurityConfig extends WebSecurityConfigurerAdapter {
//        UserDetailsService us1() {
//            InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//            manager.createUser(User.withUsername("javaboy").password("{noop}123").roles("admin", "aaa", "bbb").build());
//            return manager;
//        }
//
//        @Override
//        protected void configure(HttpSecurity http) throws Exception {
//            http.antMatcher("/foo/**")
//                    .authorizeRequests()
//                    .anyRequest().hasRole("admin")
//                    .and()
//                    .formLogin()
//                    .loginProcessingUrl("/foo/login")
//                    .permitAll()
//                    .and()
//                    .userDetailsService(us1())
//                    .csrf().disable();
//        }
//    }
//
//    /**
//     * 过滤器链2，单独配置UserDetailsService
//     */
//    @Configuration
//    @Order(2)
//    static class DefaultWebSecurityConfig2 extends WebSecurityConfigurerAdapter {
//        UserDetailsService us2() {
//            InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//            manager.createUser(User.withUsername("江南一点雨").password("{noop}123").roles("user", "aaa", "bbb").build());
//            return manager;
//        }
//
//        @Override
//        protected void configure(HttpSecurity http) throws Exception {
//            http.antMatcher("/bar/**")
//                    .authorizeRequests()
//                    .anyRequest().hasRole("user")
//                    .and()
//                    .formLogin()
//                    .loginProcessingUrl("/bar/login")
//                    .permitAll()
//                    .and()
//                    .csrf().disable()
//                    .userDetailsService(us2());
//        }
//    }
//}